package com.shujia.day10;

import java.util.TreeMap;

public class Demo06TreeMap {
    public static void main(String[] args) {
        /*
            TreeMap类概述
                键是红黑树结构，可以保证键的排序和唯一性
                作用：当存入的数据需要进行排序时,并去重时，那么此时可以使用TreeMap
         */
        TreeMap<Integer,String> treeMap = new TreeMap<>();
        treeMap.put(1,"one");
        treeMap.put(3,"three");
        treeMap.put(2,"two");
        System.out.println(treeMap);  // {1=one, 2=two, 3=three} => 对数据进行了自然排序
        System.out.println(treeMap.get(1));

        // descending 表示倒叙
        for (Integer key : treeMap.descendingKeySet()) {
            System.out.println("key:"+key+"\tvalue:"+treeMap.get(key));
        }

        System.out.println(treeMap.lastEntry());
        System.out.println(treeMap.firstEntry());
        // TODO 替换Value值的方式：
        treeMap.put(2,"2");
        System.out.println(treeMap);
        // 替换数据后返回旧的值 => 对某个Key的Value值仅使用一次，时候后更新
        String oldValue = treeMap.replace(2, "22");
        System.out.println(treeMap+"\t"+oldValue);
        // 当要替换的数据需要确定是否是我们正常所设想的值时，可以使用该方法
        boolean replace = treeMap.replace(2, "2", "222");
        System.out.println(replace);
        System.out.println(treeMap);

        /*
            TODO 自定义对象作为其Key
                com.shujia.day10.TreeKey cannot be cast to java.lang.Comparable
                 TreeMap 需要根据Key对数据进行排序，那么排序时，需要给定排序依据
                    底层调用是 ((Comparable<? super K>)k1).compareTo((K)k2) 需要将Key强制类型转换Comparable再调用
                        其 compareTo 方法
         */
        System.out.println("==================");
        TreeMap<TreeKey, String> stringTreeMap = new TreeMap<>();
        stringTreeMap.put(new TreeKey("1"),"1");
        stringTreeMap.put(new TreeKey("2"),"2");
        stringTreeMap.put(new TreeKey("3"),"3");
        System.out.println(stringTreeMap);




    }
}
class TreeKey implements Comparable<TreeKey>{
    String data;

    public TreeKey(String data) {
        this.data = data;
    }

    @Override
    public int compareTo(TreeKey o) {
//        System.out.println(o.data.compareTo(o.data));
        return this.data.compareTo(o.data);
    }

    @Override
    public String toString() {
        return "TreeKey{" +
                "data='" + data + '\'' +
                '}';
    }
}
